#include "ModRunTemplateMethod.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_TemplateMethod/TemplateMethodApplication.h"
#include "Gof23/Gof_TemplateMethod/TemplateMethodLibrary.h"
#include "Gof23/Gof_TemplateMethod/NorApplication.h"
#include "Gof23/Gof_TemplateMethod/NorLibrary.h"

//模板方法模式的ModRun（TemplateMethod）;
ModRunTemplateMethod::ModRunTemplateMethod()
{
    //模式名称;
    m_strModelName = "模板方法模式（TemplateMethod）;";
    //模式描述;
    m_strModelDesc = "模板模式：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。\r\n"
        "当多个类有相同的方法，并且逻辑相同，只是细节上有差异时，可以考虑使用模板模式。具体的实现上可以将相同的核心算法设计为模板方法，具体的实现细节有子类实现。\r\n"
        "缺点 : 每一个不同的实现都需要一个子类来实现，导致类的个数增加，使得系统更加庞大。\r\n"
                     ;
}

//初始化显示模式;
void ModRunTemplateMethod::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunTemplateMethod::GetEnum()
{
    return emModRunTemplateMethod;
}

//运行模式;
void ModRunTemplateMethod::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========模板方法模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========模板方法模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //模板方法模式;
        //原始方式，先写lib，再写调用exe， exe需要知道lib的过程（稳定结构）;
        NorApplication app;
        app.Run();


        TemplateMethodApplication tempApp;
        tempApp.Run();

        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunTemplateMethod::CreateMe()
{
    return new ModRunTemplateMethod();
}
